package com.zhj.springbootinit.manager;

import com.zhj.springbootinit.common.ErrorCode;
import com.zhj.springbootinit.config.RedissonConfig;
import com.zhj.springbootinit.exception.ThrowUtils;
import org.redisson.api.RRateLimiter;
import org.redisson.api.RateIntervalUnit;
import org.redisson.api.RateType;
import org.redisson.api.RedissonClient;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;

/**
 * 通用能力，调用Redisson限流基础服务
 */
@Service
public class RedisLimiterManager {

    @Resource
    private RedissonClient redissonClient;

    /**
     * 具体限流操作
     *
     * @param key 根据key区分不同用户，分别进行统计
     */
    public void doRateLimit(String key) {
        // 根据key，创建一个限流器，每秒最多访问2次
        RRateLimiter rateLimiter = redissonClient.getRateLimiter(key);
        rateLimiter.trySetRate(RateType.OVERALL, 2, 1, RateIntervalUnit.SECONDS);

        // 每一个请求打进来，都需要进行请求令牌操作
        boolean canOption = rateLimiter.tryAcquire(1);
        ThrowUtils.throwIf(!canOption, ErrorCode.TOO_MANY_REQUEST);
    }
}
